package com.xs.aifitnessagent.service.impl;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.xs.aifitnessagent.advison.MyLoggerAdvisor;
import com.xs.aifitnessagent.entities.dto.ChatDTO;
import com.xs.aifitnessagent.service.AiService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author xsf
 *
 */
@Service
@Slf4j
public class AiServiceImpl implements AiService {

    private final ChatClient chatClient;

    /**
     * 初始化对话模型
     *
     * @param dashscopeChatModel 对话模型
     */
    public AiServiceImpl(ChatModel dashscopeChatModel) {
        chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultAdvisors(new MyLoggerAdvisor())
                .build();
    }

    private static final String TITLE_SYSTEM_PROMPT= """
            根据用户首条消息生成简洁的会话标题。
            
            输出格式（仅返回JSON）：
            {
              \"keywords\": [\"关键词1\", \"关键词2\"],
              \"title\": \"标题\"
            }
            
            规则：
            1. 提取1-3个核心关键词；问候语（你好/您好/hi…）关键词用“健身咨询”。
            2. 标题<=15字（中文）或<=10词（英文）；问候语统一标题“健身咨询”。
            3. 仅输出JSON，不添加其它说明。
            """;

    @JsonPropertyOrder({"keywords","title"})
    record TitleKeyWords(List<String> keywords, String title) {
    }

    @Override
    public String doChatGetTitle(ChatDTO chatDTO) {
        try {
            TitleKeyWords entity = chatClient
                    .prompt()
                    .user(chatDTO.getMessage())
                    .system(TITLE_SYSTEM_PROMPT)
                    .call()
                    .entity(TitleKeyWords.class);
            if (entity != null && entity.title != null && !entity.title.trim().isEmpty()) {
                return entity.title.trim();
            }
        } catch (Exception e) {
            log.warn("标题生成失败，使用回退逻辑。原因: {}", e.getMessage());
        }
        // 回退：使用用户原始输入生成简短标题
        return generateFallbackTitle(chatDTO.getMessage());
    }

    // 新增：生成回退标题的方法
    private String generateFallbackTitle(String message) {
        if (message == null) {
            return "健身咨询";
        }
        // 去除空白字符
        String trimmed = message.replaceAll("\\s+", "").trim();
        if (trimmed.isEmpty()) {
            return "健身咨询";
        }
        return trimmed.length() <= 15 ? trimmed : trimmed.substring(0, 15);
    }
}
